﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using PPI.Client.Logic.Delegate;
using PPI.Entities.Enumerator;
using PPI.Entities.Settings.Mobile;
using PPI.Entities.XML;
using PPI.Mobile.Logic;

namespace PPI.Client.Logic
{
    public class LOutbox
    {
        /// <summary>
        /// CO 3.0
        /// retorna una instancia de EXmlOutboxBase de acuerdo al tipo de base de datos que se tenga en las 
        /// tablas. ver EXmlOutboxGPS,EXmlOutboxInspection
        /// si el tipo de base de datos no es valido, retorna null
        /// </summary>
        /// <param name="connectionString">Connection string de la base de datos que se quiere inspeccionar</param>
        /// <returns></returns>
        public static EXmlOutboxBase GetXmlOutboxBase(string connectionString)
        {
            string type = GetSettingNameByKey(connectionString, EnumMobileSettings.MobileTypeDatabase);

            EXmlOutboxBase _returnOutbox = null;

            if(type != null)
            {
                DatabaseTypes _tmpDatabaseType = (DatabaseTypes)Enum.Parse(typeof(DatabaseTypes), type.ToString());

                switch (_tmpDatabaseType)
                {
                    case DatabaseTypes.GPS:
                        _returnOutbox = new EXmlOutboxGPS();
                        break;
                    case DatabaseTypes.Inspection:
                        _returnOutbox = new EXmlOutboxInspection();
                        break;
                    case DatabaseTypes.Project:
                        _returnOutbox = new EXmlOutboxProject();
                        break;
                    case DatabaseTypes.DistributionGPS:
                        _returnOutbox = new EXmlOutboxDistributionGPS();
                        break;
                    case DatabaseTypes.DistributionInspection:
                        _returnOutbox = new EXmlOutboxDistributionInspection();
                        break;
                }
            }

            if(_returnOutbox != null)
            {
                _returnOutbox.ConnectionString = connectionString;
            }

            return _returnOutbox;
        }

        public static DatabaseTypes GetDatabaseType(string connectionString)
        {
            DatabaseTypes _tmpDatabaseType = DatabaseTypes.None;
            string type = GetSettingNameByKey(connectionString, EnumMobileSettings.MobileTypeDatabase);

            EXmlOutboxBase _returnOutbox = null;

            if (type != null)
            {
               _tmpDatabaseType = (DatabaseTypes)Enum.Parse(typeof(DatabaseTypes), type.ToString());

            }
            return _tmpDatabaseType;
        }

        public static void CopyMobileDatabase(DirectoryInfo diSource, DirectoryInfo diDestination, bool blOverwrite, UpdateBar step)
        {
            DirectoryInfo[] diSourceSubDirectories;
            FileInfo[] fiSourceFiles;

            //obtengo todos los archivos del directorio origen
            fiSourceFiles = diSource.GetFiles();
            //obtengo los subdirectorios (si existen)
            diSourceSubDirectories = diSource.GetDirectories();

            //si no existe el directorio destino crearlo
            if (!diDestination.Exists) diDestination.Create();

            //Usar la recursividad para navegar por los subdirectorios
            //e ir obteniendo los archivos hasta llegar al final
            foreach (DirectoryInfo diSourceSubDirectory in diSourceSubDirectories)
            {
                CopyMobileDatabase(diSourceSubDirectory, new DirectoryInfo(diDestination.FullName + "\\" +
                diSourceSubDirectory.Name), blOverwrite, step);
            }

            Int32 _totalFiles = fiSourceFiles.Length;
            Int32 _copiedFiles = _totalFiles;
            foreach (FileInfo fiSourceFile in fiSourceFiles)
            {
                if (fiSourceFile.Extension != "xml")
                {
                    fiSourceFile.CopyTo(diDestination.FullName + "\\" + fiSourceFile.Name, blOverwrite);
                    _copiedFiles--;
                    step(100 - ((_copiedFiles*100)/_totalFiles));
                }
            }
        }

        public static string GetSettingNameByKey(string connectionString,EnumMobileSettings typeSettings )
        {
            StringBuilder _query = new StringBuilder();
            DatabaseTypes _tmpDatabaseType = DatabaseTypes.None;
            #region Query

            _query.AppendLine("Select SettingName from tb_Settings where SettingKey = '" +
                              (Int32)typeSettings + "' ");

            #endregion

            string result = (string)LMobileDatabase.ExecuteScalar(_query.ToString(), connectionString);

            return result;
        }
    }
}
